linux 终端崩溃排查

·

现象

第一次发生崩溃是在使用Ctrl+R 进行历史命令搜索时发生, 按下Ctrl+R后, 1秒内终端就直接退出了

排查过程

重置终端

# 重置gnome-terminal配置
dconf reset -f /org/gnome/terminal/
# 或完全删除配置
rm -rf ~/.config/gnome-terminal/

检查日志

journalctl -xe | grep -i terminal
dmesg | grep -i error

尝试其他终端

  • 首次使用tilix时,发现正常了
  • 但是这只是表象 ORZ
  • 用了一天之后,又发生了同样的异常
apt install tilix
tilix

怀疑fzf

首先 Ctrl + R 绑定的程序是fzf

bindkey | grep -Ei '\^r'
  • 直接运行fzf发现就会发生崩溃

为什么新安装的终端不会崩溃呢?

  • 使用strace发现fzf发生了141退出吗,
  • 搜索后发现是sigpipe导致的: sig = errno - 128 = 141 - 128 = 13
  • 即退出码141对应信号13(SIGPIPE)
strace -f -o fzf.log fzf
strace -f -e trace=pipe,write,socket -o debug.log fzf
  • 怀疑是结果过大导致的
  • 最后缩小范围,发现候选行数超过一定行数fzf就会报错
  • 但是这个值会发生变化
yes | head -n 46149 | fzf
seq 50000 | fzf

换终端模拟器

  • apt install kitty
  • apt install alacritty
  • apt install tilix #(也基于 VTE,但版本有时会稍微稳定些)
  • 用 tmux 作为缓冲
seq 1000000 | fzf

我切换了kitty终端,发现是正常的, 怀疑的确是VTE的bug导致的

为什么 kitty / alacritty 正常?

终端渲染引擎特点
kitty自研 GPU 加速高性能,专为大输出优化
alacrittyGPU 加速(OpenGL)极致性能,Rust 编写
gnome-terminal / tilixVTE(CPU 渲染)功能完整但性能较弱

👉 kitty 和 alacritty 使用现代渲染架构,能更高效处理 fzf 的快速滚动和高密度输出。

解决方案

续使用 kitty 或 alacritty(推荐)

这是最稳定、长期有效的方案:

# 安装 kitty
sudo apt install kitty
# 或安装 alacritty
sudo apt install alacritty

💡 推荐 kitty:功能丰富、文档完善、对 fzf/tmux 支持极佳。

升级 VTE 到 0.76+(风险较高)

Ubuntu 24.04 默认未提供新版 VTE,但您可以:

  • 从 Debian 测试源或第三方 PPA 安装
# 添加提供新版 VTE 的 PPA(需谨慎)
# 例如:https://launchpad.net/~gnome-team/+archive/ubuntu/gnome3
sudo add-apt-repository ppa:gnome-team/gnome3
sudo apt update
sudo apt install libvte-2.91-dev libvte-2.91-0

什么是 VTE?

VTE 是 GNOME Terminal、Tilix、MATE Terminal 等使用的底层终端控件库(libvte) Ubuntu 24.04 默认带的是 VTE 0.74.x,这个版本在 Gitlab issue 里已经有 “ncurses 程序在大数据输入下崩溃” 的 bug 报告,可以试试更新到 0.76+ 或从源码编译新版本。 该版本在处理高吞吐量、快速连续的 ANSI/VT100 控制序列输出时,存在缓冲区管理缺陷